package org.beetl.sql.springboot.conf;


import com.beetl.sql.rewrite.RewriteConfig;
import com.beetl.sql.rewrite.SchemaRewriteParam;
import com.beetl.sql.rewrite.TableNameProvider;
import com.beetl.sql.rewrite.TableRewriteParam;
import org.beetl.core.Context;
import org.beetl.core.Function;
import org.beetl.sql.core.engine.template.BeetlTemplateEngine;
import org.beetl.sql.springboot.Db;
import com.zaxxer.hikari.HikariDataSource;
import org.beetl.sql.core.SQLManager;
import org.beetl.sql.ext.DBInitHelper;
import org.beetl.sql.starter.SQLManagerCustomize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

import javax.sql.DataSource;

@Configuration
public class DatasourceConfig {
	@Autowired
	ApplicationContext ctx;

	@Bean(name = "ds")
	public DataSource datasource(Environment env) {
		HikariDataSource ds = new HikariDataSource();
		ds.setJdbcUrl(env.getProperty("spring.datasource.url"));
		ds.setUsername(env.getProperty("spring.datasource.username"));
		ds.setPassword(env.getProperty("spring.datasource.password"));
		ds.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
		ds.setMaximumPoolSize(2);
		return ds;
	}

	@Bean
	public SQLManagerCustomize schemaTenantSQLManagerCustomize() {
		return new SQLManagerCustomize() {
			@Override
			public void customize(String sqlMangerName, SQLManager manager) {
				DBInitHelper.executeSqlScript(manager, "db/schema.sql");
				RewriteConfig rewriteConfig = new RewriteConfig();
				rewriteConfig.config(manager);
				//所有sql表名有order_log，替换成order_log_${tenantId}
				rewriteConfig.setTableRewriteConfig(new SchemaRewriteParam(new TableNameProvider(){

					@Override
					public String getTableName(String name) {
						//所有表都加上schema前缀,如果是其他数据库，可能name已经包含了默认shcema，比如public，需要替换
						return "schema_"+Db.localValue.get()+"."+name;
					}
				}));

			}
		};

	}
}
